import { createRouter, createWebHistory } from "vue-router";
import { staticRoutes } from "./routes";
import { useUserInfoStore } from '../stores/userInfo';
import pinia from '../stores';
import { getToken, removeToken } from '../utils/index.js';
import { ElMessage } from 'element-plus';



/**
 * 创建Vue路由实例
 * 使用history模式避免URL中出现#
 */
const router = createRouter({
  history: createWebHistory(),
  routes: staticRoutes,
});

const userInfoStore = useUserInfoStore(pinia)

/**
 * 全局路由前置守卫
 * 在每次路由跳转前检查用户登录状态和权限
 * @param {RouteLocationNormalized} to - 即将要进入的目标路由对象
 * @param {RouteLocationNormalizedLoaded} from - 当前导航正要离开的路由对象
 * @param {Function} next - 用来resolve这个钩子的函数，调用方法：next()、next(false)、next('/')等
 */
router.beforeEach(async (to, from, next) => {
  // 获取存储的token
  const token = getToken()
  // 检查用户信息store中是否存在昵称来判断是否已获取用户信息
  const userInfo = !!userInfoStore.nickName
  if (token) {
    // 用户已登录
    if (to.path == "/login") {
      // 已登录用户访问登录页时重定向到首页
      next({ path: "/" })
    } else {
       if (userInfo) {
         // 已有用户信息，直接放行
         next()
       } else {
         // 尝试获取用户信息
         try {
           await userInfoStore.getInfo()
           next()
         } catch (error) {
           // 获取用户信息失败则清除token
           removeToken()
         }
       }
    }
  } else {
   // 无token情况直接放行（由路由组件内部处理未登录情况）
   next()
  }
});

// //使用全局后置钩子配置关闭进度条
// router.afterEach(() => {
//   NProgress.done();
// });

// 导出路由
export default router;